package br.museu.negocio;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.museu.constantes.ConstantesSistema;
import br.museu.dao.basic.intefaces.IEventoDAO;
import br.museu.excessoes.CampoObrigatorioException;
import br.museu.excessoes.DataFinalInvalidaException;
import br.museu.excessoes.ObjetoNaoEncontradoException;
import br.museu.model.Evento;
import br.museu.negocio.interfaces.IEventoNegocio;

@Service("eventoNegocio")
@Transactional
public class EventoNegocio implements IEventoNegocio {

	@Autowired
	private IEventoDAO eventoDAO;

	public EventoNegocio() {
	}

	public void cadastrarAlterarEvento(Evento evento) {

		if (evento.getId() != null) {
			eventoDAO.alterar(evento);
		} else {
			evento.setCodigo(setCodigoEvento());
			eventoDAO.inserir(evento);
		}

	}

	private Integer setCodigoEvento() {
		Random rand = new Random();

		Integer codigo = rand.nextInt(100) + 99;

		return codigo;
	}

	public void removerEvento(Integer codigo) throws ObjetoNaoEncontradoException {
		Evento evento = eventoDAO.consultarPorId(codigo);

		if (evento == null) {
			throw new ObjetoNaoEncontradoException();
		}

		eventoDAO.remover(evento);
	}

	public void alterarEvento(Evento evento) throws ObjetoNaoEncontradoException {

		if (eventoDAO.consultarPorId(evento.getId()) == null) {
			throw new ObjetoNaoEncontradoException();
		}

		eventoDAO.alterar(evento);

	}

	public List<Evento> listarEventos(String filtro, String dtInicio, String dtFim) {
		List<Evento> listaEventos = new ArrayList<Evento>();

		if (filtro != null && !filtro.isEmpty()) {
			if (filtro.equals(ConstantesSistema.FILTRO_EVENTOS_DIA)) {
				listaEventos = eventoDAO.getEventosDia();
			} else if (filtro.equals(ConstantesSistema.FILTRO_EVENTOS_SEMANA)) {
				listaEventos = eventoDAO.getEventosSemana();
			} else if (filtro.equals(ConstantesSistema.FILTRO_EVENTO_MES)) {
				listaEventos = eventoDAO.getEventosMes();
			}
		} else {
			// consultar por data
			listaEventos = eventoDAO.consultarTodos();
		}

		return listaEventos;
	}

	public void validarEvento(String nome, String dtInicio, String dtFim, String qtdTickets, String valorTicket) throws CampoObrigatorioException, DataFinalInvalidaException {
		if (nome == null || nome.isEmpty()) {
			throw new CampoObrigatorioException("nome");
		}

		if (dtInicio == null || dtInicio.isEmpty()) {
			throw new CampoObrigatorioException("data inicio");
		}

		if (dtFim == null || dtFim.isEmpty()) {
			throw new CampoObrigatorioException("data fim");
		}

		if (qtdTickets == null || qtdTickets.isEmpty()) {
			throw new CampoObrigatorioException("quantidade de tickets");
		}

		if (valorTicket == null || valorTicket.isEmpty()) {
			throw new CampoObrigatorioException("valor ticket");
		}

		LocalDate ltDtInicio = new LocalDate(dtInicio);
		LocalDate ltDtFim = new LocalDate(dtFim);

		if (ltDtFim.isBefore(ltDtInicio)) {
			throw new DataFinalInvalidaException();
		}

	}

	public Evento buscarEventoPorCodigo(String eventoId) {
		return eventoDAO.consultarPorCodigo(new Integer(eventoId));
	}

}
